import ar.com.ironsoft.dynamicconfigloader.DynamicLoaderService

class DynamicConfigLoaderGrailsPlugin {
	// the plugin version
	def version = "0.1"
	// the version or versions of Grails the plugin is designed for
	def grailsVersion = "1.3.5 > *"
	// the other plugins this plugin depends on
	def dependsOn = [:]
	// resources that are excluded from plugin packaging
	def pluginExcludes = [
		"grails-app/views/error.gsp"
	]

	// TODO Fill in these fields
	def author = "Tomas de Priede"
	def authorEmail = "tomasdepriede@gmail.com"
	def title = "Grails dynamic config loader"
	def description = '''\\
Reads the configuration of the grails application from Config.groovy and inserts into persistent objects to be saved in the database. Then in posterior startups, the configuration is first readed from database and then if the config is not found, is readed from the config.groovy and inserted in db. Also provides a flush method from http to provide hot changes.
'''

	// URL to the plugin's documentation
	def documentation = "http://code.google.com/p/dynamic-config-loader/"

	def doWithWebDescriptor = { xml ->
		// TODO Implement additions to web.xml (optional), this event occurs before
	}

	def doWithSpring = {
		// TODO Implement runtime spring config (optional)
	}

	def doWithDynamicMethods = { ctx ->
		application.domainClasses.each { domainClass ->
			if (domainClass.getName().endsWith("Config")){
				domainClass.metaClass.static.readFromConfig = {
					->
					return DynamicLoaderService.readFromConfig(domainClass);
				}
				domainClass.metaClass.static.readFromDatabase = {
					->
					return DynamicLoaderService.readFromDatabase(domainClass);
				}
				domainClass.metaClass.flush = { -> println "flushing" }
			}
		}

	}

	def doWithApplicationContext = { applicationContext ->
		// TODO Implement post initialization spring config (optional)
	}

	def onChange = { event ->
		// TODO Implement code that is executed when any artefact that this plugin is
		// watching is modified and reloaded. The event contains: event.source,
		// event.application, event.manager, event.ctx, and event.plugin.
	}

	def onConfigChange = { event ->
		// TODO Implement code that is executed when the project configuration changes.
		// The event is the same as for 'onChange'.
	}
}
